<?php
namespace Game\Model;
use Think\Model;
/**
 * 游戏用户积分表
 * @author huhaiqin
 */
class GameUserJifenModel extends Model{
	protected $tableName ='game_user_jifen';

    /**
     * 添加积分
     * @param $uid
     * @param $key        // 用户辨别获取积分的类型，如：每日签到，每日登录，每日分享等
     * @param $jifen
     * @param string $p1  // 自定义参数，比如羁绊ID
     * @param string $p2
     * @param string $p3
     * @return bool
     */
    public function _add($uid, $key, $jifen, $idol_id, $p2 = '', $p3 = ''){
        $id = $this->add(array(
            'uid' => $uid,
            'key' => $key,
            'jifen' => $jifen,
            'idol_id' => $idol_id,
            'p2' => $p2,
            'p3' => $p3,
            'create_time' => time(),
        ));
        if($id){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 获取用户的总积分,根据uid获取,一段时间内的积分，默认是当月
     * @param $uid
     * @param $start_time
     * @param $end_time
     * @return mixed
     */
    public function getTotalJifen($uid,$start_time = 0,$end_time = 0){
        if(!$uid){
            return false;
        }
        if(!$start_time){
            $start_time = strtotime(date('Y-m-01 00:00:00'));
        }
        if(!$end_time){
            $end_time = strtotime(date('Y-m-t 23:59:59'));
        }
        $jifen = $this->where(array('uid'=>$uid,'create_time'=>array('between',array($start_time,$end_time))))->sum('jifen');
        return $jifen;
    }

    /**
     * 根据羁绊ID和key获取一段时间内的羁绊的总积分
     * 查询设置1分钟的缓存，避免频繁查询数据库
     * 1. 先从缓存中获取数据
     * 2. 如果缓存中没有数据，从数据库中获取数据
     * 3. 将数据存入缓存
     * 4. 返回数据
     * 5. 缓存的key是：game_user_jifen_$idol_id_$key_$start_time_$end_time
     * 6. 缓存的时间是：1分钟
     * 7. 缓存的数据是：$jifen
     * 8. 如果缓存中没有数据，从数据库中获取数据
     * 9. 将数据存入缓存
     * 10. 返回数据
     * @param $idol_id
     * @param $key
     * @param $start_time
     * @param $end_time
     * @return mixed
     */
    public function getTotalJifenByKeyAndIdol($idol_id = 0,$key = '',$start_time = 0,$end_time = 0){
        if(!$idol_id){
            return false;
        }
        if(!$key){
            return false;
        }
        //默认为当月
        if(!$start_time){
            $start_time = strtotime(date('Y-m-01 00:00:00'));
        }
        if(!$end_time){
            $end_time = strtotime(date('Y-m-t 23:59:59'));
        }
        $cache_key = 'game_user_jifen_'.$idol_id.'_'.$key.'_'.$start_time.'_'.$end_time;
        $jifen = S($cache_key);
        if($jifen){
            return $jifen;
        }
        $jifen = $this->where(array('p1'=>$idol_id,'key'=>$key,'create_time'=>array('between',array($start_time,$end_time))))->sum('jifen');
        // echo $this->_sql();
        S($cache_key,$jifen,60);
        return $jifen;
    }

    /**
     * 根据羁绊id数组和key，获取一段时间内这些羁绊的总积分排名
     * 1. 调佣getTotalJifenByKeyAndIdol方法，获取每个idol的总积分
     * 2. 对总积分进行排序
     * 3. 返回排序后的数组
     * 4. 数组的key是idol_id，value是总积分
     * @param $idol_ids
     * @param $key
     * @param $start_time
     * @param $end_time
     * @return mixed
     */
    public function getTotalJifenByKeyAndIdols($idol_ids = [],$key = '',$start_time = 0,$end_time = 0){
        $jifen = array();
        foreach($idol_ids as $idol_id){
            $jifen[$idol_id] = $this->getTotalJifenByKeyAndIdol($idol_id,$key,$start_time,$end_time);
        }
        arsort($jifen);
        return $jifen;
    }
}   